/**
 * @file motor.h
 * @brief 大疆电机驱动核心头文件
 *        定义电机类型枚举、数据结构体及初始化/通信相关接口函数
 * @author WeiFan Qiu (qiuweifan0523@faxmail.com)
 * @version 1.0
 * @date 2025-08-08
 * 
 * @copyright Copyright (c) 2025 邱伟凡
 * 
 * @par 修改日志:
 * - 2025-08-07: 初始版本创建，定义基础电机数据结构和接口
 * - 2025-08-08: 整理删除无用定义
 * @bug 待解决问题:
 * - 未支持多电机同步控制逻辑
 */
#ifndef MOTOR_H
#define MOTOR_H
#include "stdint.h"
#include "QWF_Can.h" 	// CAN通信相关头文件
#include "QWF_Include.h"	// 通用包含头文件

/********************************* 类型定义层 *********************************/
/**
 * @brief 电机角度返回模式枚举
 * @details 定义是否需要使用电机的角度反馈数据
 */
typedef enum{
	without_round=0, 	///< 记录圈数（仅需转速/转矩）
	with_round, 		///< 不记录圈数（记圈数的过零）
	motor_return_mode_num	///< 模式数量（用于数组大小）
}motor_return_mode_e;

/**
 * @brief 电机通信模式枚举
 * @details 定义电机的CAN总线使用模式（仅接收/仅发送/双向）
 */
typedef enum{
	Only_rx=0, 		///< 仅接收电机反馈数据
	Only_tx, 		///< 仅向电机发送控制指令
	rx_and_tx 		///< 双向通信（同时接收和发送）
}Motor_Use_Type_e;

/**
 * @brief 	大疆电机数据结构体
 * @details 包含电机配置参数、实时测量数据及处理后数据
 */
typedef struct{
	struct{
		/* 配置参数（初始化时固定） */
		const Motor_Use_Type_e mode; 		///< 通信模式（Only_rx/Only_tx/rx_and_tx）
		const Motor_Type_e  type; 			///< 电机类型（需与实际硬件匹配）
		const uint8_t	ID; 				///< 电机ID（1-8，根据电调设置）
		const uint8_t	can; 				///< 所属CAN总线（CAN1/CAN2）
		uint16_t		rx_stdId; 			///< 接收帧ID（由can和ID自动计算）
		uint16_t		tx_stdId; 			///< 发送帧ID（由can和ID自动计算）
		uint8_t*		tx_adress; 			///< 发送数据缓冲区指针
	}config; 								///< 电机配置信息
	struct{
		/* 电机原始反馈数据 */
		float 		angle[3]; 				///< 机械角度数组（0:上一时刻 1:实时 2:过零处理后）
		int16_t 	rpm; 					///< 实时转速（单位: RPM）
		int16_t 	torque; 				///< 转矩电流（单位: mA）
		float 		trm; 					///< 电机温度（仅GM6020支持，C610/C620无此数据）
		/* 处理后扩展数据 */
		float 		round; 				///< 累计转过的圈数（配合angle[2]使用）
		int16_t 	angle_begin; 		///< 初始角度（校准用）
		motor_return_mode_e flag; 		///< 状态标志（0:是否启用角度 1:初始角度是否校准完成）
	}rx_meas; 							///< 电机测量及处理数据
}DJI_Motor_t;

/**
 * @brief 电调ID枚举
 */
typedef enum{
	id200=0, 		///< 对应ID 0x200（常见于C610/C620电调）
	id1ff, 			///< 对应ID 0x1FF
	id2ff, 			///< 对应ID 0x2FF
	id1fe, 			///< 对应ID 0x1FE
	id2fe, 			///< 对应ID 0x2FE
	Elec_Ctrl_ID_Num 	///< 电调ID类型数量
}Elec_Ctrl_ID;

/**
 * @brief 电机反馈数据处理函数指针类型
 * @param motor 电机结构体指针
 * @param Data CAN接收数据缓冲区指针
 */
typedef void (*DJI_Motor_Return_Function)(DJI_Motor_t* motor,uint8_t* Data);

/********************************* 应用层接口 *********************************/
/**
 * @brief 电机初始化函数
 */
void DJI_Motor_Init(DJI_Motor_t* DJI_Motor);
void Motor_Init(void);
/**
 * @brief 电机接收函数，with_round记录圈数，without_round不记录圈数
 */
extern DJI_Motor_Return_Function  	DJI_Motor_return	[motor_return_mode_num];
#endif
